package cn.magicman.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

//这个controller是为了Jmeter测试的

@RestController
@RequestMapping("/thread4Jmeter")
public class ThreadController {


    private static Map<String, Integer> map = new HashMap<>();

    static {
        map.put("a", 1);
        map.put("b", 1);
        map.put("counter", 0); // 用于计数器的键
    }

    @GetMapping("/test")
    public String test() {
        return "test";
    }


    @GetMapping("/get")
    public Integer getMapA() {
        map.put("a", 1);
        Integer i = map.get("a");
        return i;
    }


    @GetMapping("/plus")
    public Integer increaseMap() {
        Integer i = map.get("a");
        i++;
        map.put("a", i);
        return map.get("a");
    }

    //Minus
    @GetMapping("/minus")
    public Integer minusMap() {
        Integer i = map.get("a");
        i--;
        map.put("a", i);
        return map.get("a");
    }


    /**
     * 非线程安全计数器（用于演示并发问题）
     * JMeter测试将观察到计数不准确
     */
    @GetMapping("/unsafe-counter")
    public Integer unsafeCounter() {
        System.out.println("执行了uc");
        int current = map.get("counter");
        current++; // 非原子操作
        simulateProcessingDelay();
        map.put("counter", current);
        return current;
    }


    // 线程安全计数器
    private static final AtomicInteger atomicCounter = new AtomicInteger(0);

    /**
     * 线程安全计数器（使用AtomicInteger）
     * JMeter测试将观察到准确计数
     */
    @GetMapping("/safe-counter")
    public Integer safeCounter() {
        System.out.println("执行了sc");
        return atomicCounter.incrementAndGet();

    }


    private void simulateProcessingDelay() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}
